package cn.sys.controller;

import cn.hutool.json.JSONUtil;
import cn.sys.util.ResponseUtil;
import cn.sys.util.ResultData;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.UUID;

/**
 * 文件上传测试的servlet
 */
@WebServlet("/fileUp")
public class TestFileUpServlet extends HttpServlet {

    private static String urls;

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String action = req.getParameter("action");
        System.out.println(action);

        switch (action){
            case "fileUp" : fileUp(req, resp);break;
            case "showImage" : showImage(req, resp);break;
        }
    }

    private void showImage(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        List<String> imageUrls = JSONUtil.toList(urls, String.class);
        ResponseUtil.send(resp, ResultData.ok(10001, imageUrls.toString()));
    }

    protected void fileUp(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        // 构建工厂对象
        FileItemFactory factory = new DiskFileItemFactory();
        // 构建文件上传对象
        ServletFileUpload servletFileUpload = new ServletFileUpload(factory);
        // 可以对其大小等属性进行设置，设置大小的单位是byte

        /*
            文件上传操作中，核心是获取FileItem对象。
            前端提交的每个input都存放在一个FileItem对象中（注意不是每个input中都是一个文件，也可能是普通文本）。
            所以在操作之前，需要使用FileItem中提供的方法判断当前对象是什么样的数据。
        */
        Map<String, List<FileItem>> parameterMap = null;
        // 存放多个图片的文件名，最终会将该数组转为JSON字符串，存入数据库中；如果要取数据直接指定文件夹即可
        List<String> imageUrls = new ArrayList<>();
        try {
            parameterMap = servletFileUpload.parseParameterMap(req);
            // 遍历取出数据，并将其写入本地文件夹，实现文件上传操作
            List<FileItem> images = parameterMap.get("image");

            for (FileItem fileItem : images) {
                //fileItem.getSize(); // 获取文件大小

                /*   在本地创建一个文件夹用来存放上传的文件。
                     注意在上传时，需要对图片的文件名进行重新生成（为了避免文件名重复而覆盖文件）（使用uuId）
                */
                // 获取原始的文件名
                String fileName = fileItem.getName();
                // 获取图片的后缀名，如 .jpg
                String suffixName = fileItem.getName().substring(fileName.lastIndexOf("."));
                // 通过UUID生成一个不重复的字符串，和后缀名拼接成行的文件名
                String newFileName = UUID.randomUUID().toString() + suffixName;

                /*
                    如果有多个图片文件，可以将文件名转为JSON数组的形式存入数据库
                    在取值的时候，将其转为数组遍历就可以了
                    List<String> urls = new ArrayList<>();
                    JSONUtil.toJSONStr(urls);   // 存，转JSON

                    JSONUtil.toList(s, String.class);   // 取，转集合
                 */
                imageUrls.add(newFileName);

                /*  创建文件夹以及file对象。
                    注意不要将文件夹指定到当前项目下，否则可能会出现重启后文件丢失的情况（以下测试一下）；
                    也不要指定到G盘这样的目录下，当文件随机部署后，有可能找不到
                */
                String filePath = req.getServletContext().getRealPath("") + File.separator + "image";
                File file = new File(filePath);
                if(!file.exists()){
                    file.mkdir();
                }
                // 将图片文件写出到指定位置
                fileItem.write(new File(filePath + File.separator + newFileName));

            }

        } catch (FileUploadException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }

        String imageUrl = JSONUtil.toJsonStr(imageUrls);

        List<FileItem> descFileItem = parameterMap.get("desc");
        String desc = new String(descFileItem.get(0).get(), "utf-8");

        System.out.println(imageUrl);
        System.out.println(desc);
        urls = imageUrl;


        /*ResponseUtil.send(resp, ResultData.ok());*/
        // 上传成功跳转图片显示页
        resp.sendRedirect("/fileShowTest.html");

        /*
            注意excel处理只需要获取流就可以了
         */

    }
}
